package main

import "fmt"

// 常量，通常定义在全局
const pi = 3.1415926
const e = 2.7182818

//同时定义多个常量
//const (
//	pi = 3.1415926
//	e = 2.7182818
//)

const (
	n1 = 10
	n2
	n3
	//如果常量中的多定义，某行的常量没有进行赋值，
	//那么就与上一行的常量的值相同
)

const (
	n11 = iota
	n21
	n31
	n41
	n51
)

func main1() {
	//相对于变量，常量是恒定不变的值，多用于定义程序运行期间不会改变的那些值。
	//常量的声明和变量声明非常类似，只是把var换成了const
	//常量在定义的时候必须赋值
	fmt.Println(n1, n2, n3)
	fmt.Println(n11, n21, n31, n41)

}

// 常见iota的示例：
// 1.使用_跳过某些值
const (
	n12 = iota //0
	n22        //1
	_
	n42 //3
)

// 2.声明中间位置插队
const (
	n13 = iota //0
	n23 = iota //100
	n33 = 100  //2
	n43 = iota //3
)
const n53 = iota //0，遇到const定义为0

// 3.定义数量级
// （这里的<<表示左移操作，1<<10表示将1的二进制表示向左移10位，也就是由1变成了10000000000，也就是十进制的1024。
// 同理2<<2表示将2的二进制表示向左移2位，也就是由10变成了1000，也就是十进制的8。）
const (
	_  = iota
	KB = 1 << (10 * iota) //1<<10
	MB = 1 << (10 * iota) //1<<20
	GB = 1 << (10 * iota) //1<<30
	TB = 1 << (10 * iota) //1<<40
	PB = 1 << (10 * iota) //1<<50
)

// 4.多个iota定义在同一行
const (
	a, b = iota + 1, iota + 2 //1,2  iota=0
	c, d                      //=iota+1，iota+2  //iota=1        //2,3
	f, g                      //=iota+1，iota+2  //iota=         //3,4
)

func main() {
	//示例1：
	fmt.Println(n12, n22, n42)

	//示例2：
	fmt.Println(n13, n23, n33, n43, n53)

	//示例4：
	fmt.Println(a, b, c, d, f, g)
}
